#include <iostream>
#include <graphics.h>
#include <stdio.h>
#include <time.h>
#include<math.h>
//结构体声明
struct Point//点结构体
{
    double x;//x坐标
    double y;//y坐标
};


//函数声明 

void BoundFill(double x,double y,int boundarycolor,int newcolor); 
void miaozhen(double secarg);
void fenzhen(double minarg);
void shizhen(double hourargrev);
int gethour();
int getmin();
int getsec();
void PointerClock();
void DigitalClock();
void mouse();
void biaopan(double x,double y);

//函数 
void biaopan(double x,double y)//表盘 
{
	double ox=x,oy=y,r=100;//表盘中心，半径 
	setcolor(WHITE);//表盘边界颜色 
	circle(ox,oy,r);//画出表盘外框 
	//表盘刻度顶点坐标 
	Point points[]={{300,200},{300,230}};
	//计算顶点个数
	double n = sizeof(points) / sizeof(Point);
    setcolor(BLUE);//设置表盘刻度颜色为蓝色 
    line(points[0].x,points[0].y,points[1].x,points[1].y);//画出表盘刻度 
    //平移表盘刻度，得到另一个刻度 
	for(int i=0;i<n;++i)
	{ 
        double dx=0,dy=170;//位移量 
        double a[3][3];
	    a[0][0]=1;a[0][1]=0;a[0][2]=0;
	    a[1][0]=0;a[1][1]=1;a[1][2]=0;
	    a[2][0]=dx;a[2][1]=dy;a[2][2]=1;
	    double b[1][3];
	    b[0][0]=points[i].x;   b[0][1]=points[i].y;  b[0][2]=1;
	    double c[1][3];
	    c[0][0]=b[0][0]*a[0][0]+b[0][1]*a[1][0]+b[0][2]*a[2][0];
	    c[0][1]=b[0][0]*a[0][1]+b[0][1]*a[1][1]+b[0][2]*a[2][1];
	    c[0][2]=b[0][0]*a[0][2]+b[0][1]*a[1][2]+b[0][2]*a[2][2];
	    points[i].x=c[0][0];
	    points[i].y=c[0][1];
        }
    line(points[0].x,points[0].y,points[1].x,points[1].y);
    //横向在做一次 
    points[0].x=200;points[0].y=300; 
    points[1].x=230;points[1].y=300;
    line(points[0].x,points[0].y,points[1].x,points[1].y);
    //平移表盘刻度，得到另一个刻度
	for(int i=0;i<n;++i)
	{ 
        double dx=170,dy=0;//位移量 
        double a[3][3];
	    a[0][0]=1;a[0][1]=0;a[0][2]=0;
	    a[1][0]=0;a[1][1]=1;a[1][2]=0;
	    a[2][0]=dx;a[2][1]=dy;a[2][2]=1;
	    double b[1][3];
	    b[0][0]=points[i].x;   b[0][1]=points[i].y;  b[0][2]=1;
	    double c[1][3];
	    c[0][0]=b[0][0]*a[0][0]+b[0][1]*a[1][0]+b[0][2]*a[2][0];
	    c[0][1]=b[0][0]*a[0][1]+b[0][1]*a[1][1]+b[0][2]*a[2][1];
	    c[0][2]=b[0][0]*a[0][2]+b[0][1]*a[1][2]+b[0][2]*a[2][2];
	    points[i].x=c[0][0];
	    points[i].y=c[0][1];
        }
    line(points[0].x,points[0].y,points[1].x,points[1].y);
    
    
    //填充表盘
	setfillcolor(GREEN);
	floodfillsurface(310,230,BLACK); 
        
}
//秒针 
void miaozhen(double secarg)
{
	
	Point points[]={{300,300},{300,230}};
	setcolor(RED);//设置秒针颜色为红色 
	//计算顶点个数
	double n = sizeof(points) / sizeof(Point);
    //秒针平移
	for(int i=0;i<n;++i)
	{ 
        double dx=-300,dy=-300;//位移量 
        double a[3][3];
	    a[0][0]=1;a[0][1]=0;a[0][2]=0;
	    a[1][0]=0;a[1][1]=1;a[1][2]=0;
	    a[2][0]=dx;a[2][1]=dy;a[2][2]=1;
	    double b[1][3];
	    b[0][0]=points[i].x;   b[0][1]=points[i].y;  b[0][2]=1;
	    double c[1][3];
	    c[0][0]=b[0][0]*a[0][0]+b[0][1]*a[1][0]+b[0][2]*a[2][0];
	    c[0][1]=b[0][0]*a[0][1]+b[0][1]*a[1][1]+b[0][2]*a[2][1];
	    c[0][2]=b[0][0]*a[0][2]+b[0][1]*a[1][2]+b[0][2]*a[2][2];
	    points[i].x=c[0][0];
	    points[i].y=c[0][1];
        }
	//秒针旋转 
	for(int i=0;i<n;++i)
	{
	    const double pi=acos(-1.0);
		double x=secarg,r,sinarg,cosarg;
		r=x*pi/180;
		sinarg=sin(r);
		cosarg=cos(r);
		 
        double a[3][3];
	    a[0][0]=cosarg;a[0][1]=sinarg;a[0][2]=0;
	    a[1][0]=-sinarg;a[1][1]=cosarg;a[1][2]=0;
	    a[2][0]=0;a[2][1]=0;a[2][2]=1;
	    double b[1][3];
	    b[0][0]=points[i].x;   b[0][1]=points[i].y;  b[0][2]=1;
	    int c[1][3];
	    c[0][0]=b[0][0]*a[0][0]+b[0][1]*a[1][0]+b[0][2]*a[2][0];
	    c[0][1]=b[0][0]*a[0][1]+b[0][1]*a[1][1]+b[0][2]*a[2][1];
	    c[0][2]=b[0][0]*a[0][2]+b[0][1]*a[1][2]+b[0][2]*a[2][2];
	    points[i].x=c[0][0];
	    points[i].y=c[0][1];
        }
    //秒针平移
	for(int i=0;i<n;++i)
	{ 
        double dx=300,dy=300;//位移量 
        double a[3][3];
	    a[0][0]=1;a[0][1]=0;a[0][2]=0;
	    a[1][0]=0;a[1][1]=1;a[1][2]=0;
	    a[2][0]=dx;a[2][1]=dy;a[2][2]=1;
	    double b[1][3];
	    b[0][0]=points[i].x;   b[0][1]=points[i].y;  b[0][2]=1;
	    double c[1][3];
	    c[0][0]=b[0][0]*a[0][0]+b[0][1]*a[1][0]+b[0][2]*a[2][0];
	    c[0][1]=b[0][0]*a[0][1]+b[0][1]*a[1][1]+b[0][2]*a[2][1];
	    c[0][2]=b[0][0]*a[0][2]+b[0][1]*a[1][2]+b[0][2]*a[2][2];
	    points[i].x=c[0][0];
	    points[i].y=c[0][1];
        }
	line(points[0].x,points[0].y,points[1].x,points[1].y);
	
	
}
void fenzhen(double minarg)//分针 
{
	Point points[]={{300,300},{300,240}};
	setcolor(BLACK);//设置分针颜色为黑色 
	//计算顶点个数
	double n = sizeof(points) / sizeof(Point);
    //分针平移
	for(int i=0;i<n;++i)
	{ 
        double dx=-300,dy=-300;//位移量 
        double a[3][3];
	    a[0][0]=1;a[0][1]=0;a[0][2]=0;
	    a[1][0]=0;a[1][1]=1;a[1][2]=0;
	    a[2][0]=dx;a[2][1]=dy;a[2][2]=1;
	    double b[1][3];
	    b[0][0]=points[i].x;   b[0][1]=points[i].y;  b[0][2]=1;
	    double c[1][3];
	    c[0][0]=b[0][0]*a[0][0]+b[0][1]*a[1][0]+b[0][2]*a[2][0];
	    c[0][1]=b[0][0]*a[0][1]+b[0][1]*a[1][1]+b[0][2]*a[2][1];
	    c[0][2]=b[0][0]*a[0][2]+b[0][1]*a[1][2]+b[0][2]*a[2][2];
	    points[i].x=c[0][0];
	    points[i].y=c[0][1];
        }
	//分针旋转 
	for(int i=0;i<n;++i)
	{
	    const double pi=acos(-1.0);
		double x=minarg,r,sinarg,cosarg;
		r=x*pi/180;
		sinarg=sin(r);
		cosarg=cos(r);
		 
        double a[3][3];
	    a[0][0]=cosarg;a[0][1]=sinarg;a[0][2]=0;
	    a[1][0]=-sinarg;a[1][1]=cosarg;a[1][2]=0;
	    a[2][0]=0;a[2][1]=0;a[2][2]=1;
	    double b[1][3];
	    b[0][0]=points[i].x;   b[0][1]=points[i].y;  b[0][2]=1;
	    int c[1][3];
	    c[0][0]=b[0][0]*a[0][0]+b[0][1]*a[1][0]+b[0][2]*a[2][0];
	    c[0][1]=b[0][0]*a[0][1]+b[0][1]*a[1][1]+b[0][2]*a[2][1];
	    c[0][2]=b[0][0]*a[0][2]+b[0][1]*a[1][2]+b[0][2]*a[2][2];
	    points[i].x=c[0][0];
	    points[i].y=c[0][1];
        }
    //分针平移
	for(int i=0;i<n;++i)
	{ 
        double dx=300,dy=300;//位移量 
        double a[3][3];
	    a[0][0]=1;a[0][1]=0;a[0][2]=0;
	    a[1][0]=0;a[1][1]=1;a[1][2]=0;
	    a[2][0]=dx;a[2][1]=dy;a[2][2]=1;
	    double b[1][3];
	    b[0][0]=points[i].x;   b[0][1]=points[i].y;  b[0][2]=1;
	    double c[1][3];
	    c[0][0]=b[0][0]*a[0][0]+b[0][1]*a[1][0]+b[0][2]*a[2][0];
	    c[0][1]=b[0][0]*a[0][1]+b[0][1]*a[1][1]+b[0][2]*a[2][1];
	    c[0][2]=b[0][0]*a[0][2]+b[0][1]*a[1][2]+b[0][2]*a[2][2];
	    points[i].x=c[0][0];
	    points[i].y=c[0][1];
        }
	line(points[0].x,points[0].y,points[1].x,points[1].y);
 }
void shizhen(double hourargrev)//时针 
{
	Point points[]={{300,300},{300,260}};
	setcolor(BLACK);//设置时针颜色为黑色 
	//计算顶点个数
	double n = sizeof(points) / sizeof(Point);
    //时针平移
	for(int i=0;i<n;++i)
	{ 
        double dx=-300,dy=-300;//位移量 
        double a[3][3];
	    a[0][0]=1;a[0][1]=0;a[0][2]=0;
	    a[1][0]=0;a[1][1]=1;a[1][2]=0;
	    a[2][0]=dx;a[2][1]=dy;a[2][2]=1;
	    double b[1][3];
	    b[0][0]=points[i].x;   b[0][1]=points[i].y;  b[0][2]=1;
	    double c[1][3];
	    c[0][0]=b[0][0]*a[0][0]+b[0][1]*a[1][0]+b[0][2]*a[2][0];
	    c[0][1]=b[0][0]*a[0][1]+b[0][1]*a[1][1]+b[0][2]*a[2][1];
	    c[0][2]=b[0][0]*a[0][2]+b[0][1]*a[1][2]+b[0][2]*a[2][2];
	    points[i].x=c[0][0];
	    points[i].y=c[0][1];
        }
	//时针旋转 
	for(int i=0;i<n;++i)
	{
	    const double pi=acos(-1.0);
		double x=hourargrev,r,sinarg,cosarg;
		r=x*pi/180;
		sinarg=sin(r);
		cosarg=cos(r);
		 
        double a[3][3];
	    a[0][0]=cosarg;a[0][1]=sinarg;a[0][2]=0;
	    a[1][0]=-sinarg;a[1][1]=cosarg;a[1][2]=0;
	    a[2][0]=0;a[2][1]=0;a[2][2]=1;
	    double b[1][3];
	    b[0][0]=points[i].x;   b[0][1]=points[i].y;  b[0][2]=1;
	    int c[1][3];
	    c[0][0]=b[0][0]*a[0][0]+b[0][1]*a[1][0]+b[0][2]*a[2][0];
	    c[0][1]=b[0][0]*a[0][1]+b[0][1]*a[1][1]+b[0][2]*a[2][1];
	    c[0][2]=b[0][0]*a[0][2]+b[0][1]*a[1][2]+b[0][2]*a[2][2];
	    points[i].x=c[0][0];
	    points[i].y=c[0][1];
        }
    //时针平移
	for(int i=0;i<n;++i)
	{ 
        double dx=300,dy=300;//位移量 
        double a[3][3];
	    a[0][0]=1;a[0][1]=0;a[0][2]=0;
	    a[1][0]=0;a[1][1]=1;a[1][2]=0;
	    a[2][0]=dx;a[2][1]=dy;a[2][2]=1;
	    double b[1][3];
	    b[0][0]=points[i].x;   b[0][1]=points[i].y;  b[0][2]=1;
	    double c[1][3];
	    c[0][0]=b[0][0]*a[0][0]+b[0][1]*a[1][0]+b[0][2]*a[2][0];
	    c[0][1]=b[0][0]*a[0][1]+b[0][1]*a[1][1]+b[0][2]*a[2][1];
	    c[0][2]=b[0][0]*a[0][2]+b[0][1]*a[1][2]+b[0][2]*a[2][2];
	    points[i].x=c[0][0];
	    points[i].y=c[0][1];
        }
	line(points[0].x,points[0].y,points[1].x,points[1].y);
    
  }
  
 //时间函数 
int gethour()//得到小时 
{
    time_t t;
    time(&t);
    struct tm* p=localtime(&t);
    return p->tm_hour;
	}
int getmin()//得到分钟 
{
    time_t t;
    time(&t);
    struct tm* p=localtime(&t);
    return p->tm_min;
	}
int getsec()//得到秒数 
{
    time_t t;
    time(&t);
    struct tm* p=localtime(&t);
    return p->tm_sec;
	}
//对象函数
void PointerClock()//指针时钟 
{
	double x=300,y=300;//设置表盘中心
	int h,m,s;//用来接住系统时间 
	double hour,min,sec,hourarg,minarg,secarg,hourargrev;//精确计算时间和指针角度
	mouse_msg msg;
	while(1)
	{
	setbkcolor(BLACK);
	setcolor(WHITE);
	setfillcolor(GREEN);
	outtextxy(0,0,"右击菜单选择表盘");
	while(mousemsg())//获取鼠标消息，这个函数会等待，等待到有消息为止
        {
            msg = getmouse();//将鼠标信息存入鼠标结构体
        }
	h=gethour();
	m=getmin();
	s=getsec();
	hour=(double)h;
	min=(double)m;
	sec=(double)s;
	secarg=(sec/60)*360;//得到秒针角度 
	minarg=(min/60)*360;//得到分针角度
	if(hour>=12&&hour<=23) hour=hour-12;//大于12点时，减去12，实现12小时制 
	hourarg=(hour/12)*360;//得到分针角度
	hourargrev=minarg/12+hourarg;
	biaopan(x,y);//画出表盘
    miaozhen(secarg);//画出秒针 
    fenzhen(minarg);//画出分针 
    shizhen(hourargrev);//画出时针
    delay_ms(60);//降低刷新频率，不然太晃眼
	cleardevice();
	if((int)msg.is_right()==1) break;
     }
     mouse();
 }
void DigitalClock()//数字时钟 
{
	mouse_msg msg;
	int h,m,s;//用来接住系统时间 
	while(1)
	{
	setbkcolor(WHITE);//设置背景色为白色
	setcolor(BLACK);//设置前景色为黑色
	setfillcolor(YELLOW);//设置填充色为黄色 
	outtextxy(0,0,"右击菜单选择表盘");
	 while(mousemsg())//获取鼠标消息，这个函数会等待，等待到有消息为止
        {
            msg = getmouse();//将鼠标信息存入鼠标结构体
        }
	h=gethour();
	m=getmin();
	s=getsec();
	bar3d(300,200,500,300,20,1);
	floodfillsurface(301,201,WHITE);
    rectprintf(370,250,200,100,"%02d:%02d:%02d",h,m,s);
    delay_ms(60);
    if((int)msg.is_right()==1) break;
     }
     mouse();
  }  
void mouse()
{
	cleardevice();
	int oldx,oldy,mouseright,mouseleft;
    mouse_msg msg;
	//鼠标事件 
    for ( ;; delay_fps(600))
    {
    setbkcolor(BLACK);
	setfillcolor(WHITE);
	setcolor(WHITE);
	outtextxy(0,0,"右击菜单选择表盘");
        while (mousemsg())//获取鼠标消息，这个函数会等待，等待到有消息为止
        {
            msg = getmouse();//将鼠标信息存入鼠标结构体
        }
		mouseright=(int)msg.is_right();//得到是否按下鼠标右键，按下则返回1
		mouseleft=(int)msg.is_left();//得到是否按下鼠标左键，按下则返回1	
		if(mouseright==1) 
		{
			bar(msg.x,msg.y,msg.x+100,msg.y+100);
			setcolor(BLACK);
			line(msg.x,msg.y+50,msg.x+100,msg.y+50);
			oldx=msg.x;oldy=msg.y;
			setcolor(WHITE); 
			outtextxy(oldx,oldy,"指针时钟");
			outtextxy(oldx,oldy+50,"数字时钟");
		}
		if(msg.x>=oldx&&msg.x<=oldx+100)//点击菜单上部 
		{
			if(msg.y>=oldy&&msg.y<=oldy+50)
			{
				if(mouseleft==1)
				{ 
					cleardevice();//在进入表盘界面时清除菜单画面 
					PointerClock();
				}
			}
		}         
        if(msg.x>=oldx&&msg.x<=oldx+100)//点击菜单下部 
		{
			if(msg.y>=oldy+50&&msg.y<=oldy+100)
			{
				if(mouseleft==1)
				{ 
					cleardevice();
					DigitalClock(); 
				}

			}
		}
		if(mouseleft==1)
		{
			cleardevice();
		}
                
    }
 } 
int main()
{
    initgraph(600,600);//初始化绘图环境
	setcaption("大实验：计数1701吴帅男"); 
    mouse();//调用鼠标事件 
    closegraph(); 
}

